from cProfile import label
from tkinter import filedialog
from typing import Self
import numpy as np
import image_io
from image_utils import logging # 从image_utils.py中导入logging对象


def crop_image(image, crop_region):
    """
    裁剪图像
    :param image: 输入图像，PIL.Image对象
    :param crop_region: 裁剪区域,格式为(上,下,左,右)
    :return: 裁剪后的图像
    """
    try:
       
        logging.info(f"开始裁剪图像，裁剪区域,{crop_region}")
        
        # TODO: 从crop_region中提取上、下、左、右的坐标
        top, bottom, left, right = crop_region
 # 直接使用切片操作，裁剪图像 image 生成裁剪后的图像 cropped_image
        
        # TODO: 直接使用切片操作，裁剪图像 image 生成裁剪后的图像 cropped_image
        cropped_image = image[top:bottom, left:right]
        
        return cropped_image
    except Exception as e:
        raise ValueError(f"Error occurred while cropping image: {e}")


def adjust_brightness(image, factor):
    """
    调整图像亮度
    :param image: numpy数组形式的图像
    :param factor: 亮度调节因子 (0-2, 1为原始亮度，对应0%-200%)
    :return: 调整后的图像
    """
    try:
        # 将图像转换为浮点型进行计算
        adjusted = image.astype(float) * factor
        # 限制值在0-255范围内
        adjusted = np.clip(adjusted, 0, 255)
        # 转换回uint8类型
        return adjusted.astype(np.uint8)
    except Exception as e:
        logging.error(f"调整亮度时发生错误: {e}")
        return None

def global_threshold(image, threshold_value):
    """
    对灰度图像进行全局阈值处理
    :param image: 输入灰度图像（numpy数组）
    :param threshold_value: 阈值（0-255）
    :return: 阈值处理后的二值图像
    """
    try:
        # 检查图像是否为灰度图
        if len(image.shape) != 2:
            raise ValueError("输入必须是灰度图像")
        
        # 使用numpy的比较运算进行阈值处理
        binary_image = (image > threshold_value).astype(np.uint8) * 255
        return binary_image
    except Exception as e:
        logging.error(f"阈值处理时发生错误: {e}")
        return None

def update_threshold(value, language_data, current_language):
    # 更新标签显示
    label.config(text=language_data[current_language]['threshold_value'].format(value))
    # 基于原始图像进行阈值处理
    binary_image = image_transform.global_threshold(self.original_image.copy(), int(value)) # type: ignore
    if binary_image is not None:
        Self.image = binary_image
        Self.display_image()

def Open_as_gray(self):
    """将原始图像转换为灰度图像"""
    self.image_path = filedialog.askopenfilename()
    if not self.image_path:
        logging.info("没有选择任何图像文件,打开操作已取消。")
        return
    self.original_image = image_io.load_image(self.image_path, as_gray=True)  # 保存原始灰度图像
    self.image = self.original_image.copy()  # 显示的是原始图像的副本
    self.display_image()
    logging.info("成功打开并转换为灰度图像。")

def shift_difference(image, shift_amount):
    """
    通过计算平移图像差异获取图像边缘
    :param image: 输入灰度图像（numpy数组）
    :param shift_amount: 平移量（正数表示右移，负数表示左移）
    :return: 边缘图像
    """
    try:
        # 检查图像是否为灰度图
        if len(image.shape) != 2:
            raise ValueError("输入必须是灰度图像")

        # 创建移动后的图像副本
        height, width = image.shape
        shifted_image = np.zeros_like(image)

        if shift_amount > 0:  # 右移
            shifted_image[:, shift_amount:] = image[:, :-shift_amount]
        else:  # 左移
            shift_amount = abs(shift_amount)
            shifted_image[:, :-shift_amount] = image[:, shift_amount:]

        # 计算差分
        diff_image = np.abs(shifted_image.astype(np.int16) - image.astype(np.int16))
        # 转换回uint8类型
        diff_image = np.clip(diff_image, 0, 255).astype(np.uint8)
        
        return diff_image
    except Exception as e:
        logging.error(f"计算移动差分时发生错误: {e}")
        return None

def create_color_mask(image, color):
    """
    创建彩色掩膜
    :param image: 输入图像
    :param color: 颜色 ('red', 'green', 'blue')
    :return: 掩膜图像
    """
    try:
        if len(image.shape) != 3:
            raise ValueError("输入必须是彩色图像")
        
        mask = np.zeros_like(image)
        if color == 'red':
            mask[:, :, 0] = image[:, :, 0]  # 红色通道
        elif color == 'green':
            mask[:, :, 1] = image[:, :, 1]  # 绿色通道
        elif color == 'blue':
            mask[:, :, 2] = image[:, :, 2]  # 蓝色通道
        
        return mask
    except Exception as e:
        logging.error(f"创建{color}掩膜时发生错误: {e}")
        return None

def apply_bitwise_operation(image1, image2, operation):
    """
    应用位运算
    :param image1: 第一个输入图像
    :param image2: 第二个输入图像
    :param operation: 运算类型 ('and', 'or', 'xor', 'not')
    :return: 运算结果图像
    """
    try:
        if operation == 'and':
            return np.bitwise_and(image1, image2)
        elif operation == 'or':
            return np.bitwise_or(image1, image2)
        elif operation == 'xor':
            return np.bitwise_xor(image1, image2)
        elif operation == 'not':
            return np.bitwise_not(image1)
        else:
            raise ValueError("不支持的运算类型")
    except Exception as e:
        logging.error(f"应用位运算时发生错误: {e}")
        return None

